package jianzhi_offer;

public class _47_不用加减乘除做加法_ {
    public static void main(String[] args) {
        _47_不用加减乘除做加法_ test = new _47_不用加减乘除做加法_();
        System.out.println(test.Add(-23,-1));
    }
    public int Add(int num1,int num2) {
        while (num2!=0) {//用num2保存进位信息 当进位为0终止
            int temp = num1^num2;//表示没有进位的结果
            num2 = (num1&num2)<<1;//两数相与左移即进位
            num1 = temp;
        }
        return num1;
    }

    //处理不了负数的情况
    public int Add1(int num1,int num2) {
        int radix = 1;//基数
        int res = 0;
        int extra = 0;//进位
        while(num1 != 0 || num2 != 0){
            int plus = (num1&num2)&1 ;//如果为1 表明都是1
            int or = (num1|num2)&1;//如果为1 表明至少有一个1
            //两种情况
            if(plus == 1){//两个都是1
                if(extra == 1){
                   res |= radix;
                }
                extra = 1;
            }else{
                if(or == 1){//有一个为1
//                    if(extra == 1){
//                        extra = 1;
//                    }
                    if(extra == 0){
                        res |= radix;
                    }
                }else{
                    if(extra == 1){
                        res |= radix;
                        extra = 0;
                    }
                }
            }
            radix = radix<<1;
            num1 = num1 >> 1;
            num2 = num2 >> 1;
        }
        if(extra == 1)//补偿
            res |= radix;
        return res;
    }
}
